package dao;

import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.hibernate.HibernateException;
import entity.PrevisaoENT;
import entity.UsuarioENT;


public class PrevisaoDAO extends GenericDAO {
	
	
	@SuppressWarnings("unchecked")
	public List<PrevisaoENT> getPrevisao(UsuarioENT usuario) {
		
		try {
			query = sessao.getNamedQuery("getPrevisao");
			query.setParameter("id_usuario", usuario.getId());
			
			if(query.list().isEmpty()){
				return null;				
			}else{
				return query.list();
			}			
		} catch (HibernateException e) {
			System.out.println("Erro encontrado:"+getClass().toString()+" Mesagem de Erro: "+e.toString());			 
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<PrevisaoENT> getPrevisaoMensal(UsuarioENT usuario, Date data) {
		
		try {
			Calendar cal = Calendar.getInstance(); 
			cal.setTime(data);
			
			int mes = cal.get(Calendar.MONTH)+1;
			int ano = cal.get(Calendar.YEAR);
			cal.add(Calendar.MONTH, -1);  
			int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);  
			String dataInicial = ano+"/"+mes+"/"+"01";
			String dataFinal = ano+"/"+mes+"/"+lastDay;
			
			query = sessao.getNamedQuery("getPrevisaoMensal");
			query.setParameter("id_usuario", usuario.getId());
			query.setParameter("data_inicial", dataInicial);
			query.setParameter("data_final", dataFinal);
			
			if(query.list().isEmpty()){
				return null;				
			}else{				
				return query.list();
			}			
		} catch (HibernateException e) {
			System.out.println("Erro encontrado:"+getClass().toString()+" Mesagem de Erro: "+e.toString());			 
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<PrevisaoENT> getMensalResumo(UsuarioENT usuario, Date data) {
		
		try {
			Calendar cal = Calendar.getInstance(); 
			cal.setTime(data);
			
			int mes = cal.get(Calendar.MONTH)+1;
			String ano = ""+cal.get(Calendar.YEAR) ;
			cal.add(Calendar.MONTH, -2);  
			String lastDay = ""+cal.getActualMaximum(Calendar.DAY_OF_MONTH);  
			
			String dataInicial =  "01"+"/"+mes+"/"+ano.substring(2,4)+" 00:00:00";
			String dataFinal = lastDay+"/"+mes+"/"+ano.substring(2,4)+" 23:59:59";
			
			String sql = "select p.id                                                             "
						+ "      ,p.descricao                                                     "
						+ "      ,p.despesa_fixa                                                  "
						+ "      ,data_pagamento                                                  "
						+ "      ,p.data_vencimento                                               "
						+ "      ,p.tipo                                                          "
						+ "      ,p.valor_estimado                                                "
						+ "      ,sum(p.valor_pagar) as valor_pagar                               "
						+ "      ,p.valor_pago                                                    "
						+ "      ,p.id_categoria_despesa                                          "
						+ "      ,p.id_categoria_receita                                          "
						+ "      ,p.id_conta_banco                                                "
						+ "      ,p.id_subcategoria_despesa                                       "
						+ "      ,p.id_usuario                                                    "
						+ "from gff.previsao p                                                    "
						+ "where id_usuario = :id_usuario 			                              "
						+ "and p.data_vencimento between date_format(:data_inicial,'%d/%m/%y %T') "
						+ " 						 and date_format(:data_final,'%d/%m/%y %T')   "
						+ "group by p.id_conta_banco                                              "
						+ "         ,p.tipo                                                       "
						+ "        ,p.data_vencimento                                             "
						+ "order by p.data_vencimento	                                          "
						+ "		   ,p.id_conta_banco                                              "
						+ "		   ,p.tipo desc                                                   ";
			
			query = sessao.createSQLQuery(sql).addEntity("previsao",PrevisaoENT.class);
			
			query.setParameter("id_usuario", usuario.getId());
			query.setParameter("data_inicial", dataInicial);
			query.setParameter("data_final", dataFinal);
			
			if(query.list().isEmpty()){
				return null;				
			}else{
				return query.list();
			}			
		} catch (HibernateException e) {
			System.out.println("Erro encontrado:"+getClass().toString()+" Mesagem de Erro: "+e.toString());			 
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<PrevisaoENT> getLimiteDespesas(UsuarioENT usuario) {
		try {
			
			String sql = "select p.id                                                             "
						+ "      ,p.descricao                                                     "
						+ "      ,p.despesa_fixa                                                  "
						+ "      ,data_pagamento                                                  "
						+ "      ,p.data_vencimento                                               "
						+ "      ,p.tipo                                                          "
						+ "      ,p.valor_estimado                                                "
						+ "      ,p.valor_pagar                                                   "
						+ "      ,sum(p.valor_pago) as valor_pago                                 "
						+ "      ,p.id_categoria_despesa                                          "
						+ "      ,p.id_categoria_receita                                          "
						+ "      ,p.id_conta_banco                                                "
						+ "      ,p.id_subcategoria_despesa                                       "
						+ "      ,p.id_usuario                                                    "
						+ "from gff.previsao p                                                    "
						+ "where   p.tipo = 'Despesa'		 			                              "
						+ "group by p.id_categoria_despesa                                        "
						+ "order by p.id_categoria_despesa	                                      ";
			query = sessao.createSQLQuery(sql).addEntity("previsao",PrevisaoENT.class);
			
			if(query.list().isEmpty()){
				return null;				
			}else{
				return query.list();
			}			
		} catch (HibernateException e) {
			System.out.println("Erro encontrado:"+getClass().toString()+" Mesagem de Erro: "+e.toString());			 
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<PrevisaoENT> getPrevisaoDia(UsuarioENT usuario, String dia) {
		
		try {
			Calendar cal = Calendar.getInstance(); 
			Date data = new Date();
			cal.setTime(data);
			
			int mes = cal.get(Calendar.MONTH)+1;
			String ano = ""+cal.get(Calendar.YEAR);
			String dataInicio = dia+"/"+mes+"/"+ano.substring(2,4)+" 00:00:00";
			String dataFim = 	dia+"/"+mes+"/"+ano.substring(2,4)+" 23:59:59";
			
			String sql  = "select p.id                                                         "
						+ "	     ,p.descricao                                                  "
						+ "      ,p.despesa_fixa                                               "
						+ "      ,data_pagamento                                               "
						+ "      ,p.data_vencimento                                            "
						+ "      ,p.tipo                                                       "
						+ "      ,p.valor_estimado                                             "
						+ "      ,sum(p.valor_pagar) as valor_pagar                            "
						+ "      ,p.valor_pago                                                 "
						+ "      ,p.id_categoria_despesa                                       "
						+ "      ,p.id_categoria_receita                                       "
						+ "      ,p.id_conta_banco                                             "
						+ "      ,p.id_subcategoria_despesa                                    "
						+ "      ,p.id_usuario                                                 "
						+ "from gff.previsao p                                                 "
						+ "where id_usuario = :id_usuario 			                           "
						+ "and data_vencimento between date_format(:dataInicio,'%d/%m/%y %T')  "
						+ "                    and     date_format(:dataFim,'%d/%m/%y %T')     "
						+ "group by p.id_conta_banco                                           "
						+ "         ,p.tipo                                                    "
						+ "        ,p.data_vencimento                                          "
						+ "order by p.data_vencimento                                          "
						+ "		   ,p.id_conta_banco                                           "
						+ "		   ,p.tipo desc	                                               " ;
		 	
			query = sessao.createSQLQuery(sql).addEntity("previsao",PrevisaoENT.class);
			query.setParameter("id_usuario", usuario.getId());
			query.setParameter("dataInicio", dataInicio);			
			query.setParameter("dataFim", dataFim);
			
			if(query.list().isEmpty()){
				return null;				
			}else{
				return query.list();
			}			
		} catch (HibernateException e) {
			System.out.println("Erro encontrado:"+getClass().toString()+" Mesagem de Erro: "+e.toString());			 
			return null;
		}
	}
	
	
	
	public PrevisaoDAO() {
		// TODO Auto-generated constructor stub
	}

}
